package com.lei.array;

/**
 * @author: leiGer
 * @Date: 2021/07/14
 * @Time: 0:08
 */
/*
给定一个 N×N 的矩阵 matrix，把这个矩阵调整成顺时针转动 90°后的形式。
例如：
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
顺时针转动 90°后为：
13 9 5 1
14 10 6 2
15 11 7 3
16 12 8 4
 */
public class rotateMatrix {
    public static void circleMatrix(int arr[][]) {
        int leftup[] = { 0, 0 }, rightdown[] = { 3, 3 };
        while (leftup[0] < rightdown[0] && leftup[1] < rightdown[1]) {
            circleSquare(leftup, rightdown, arr);
            leftup[0]++;
            leftup[1]++;
            rightdown[0]--;
            rightdown[1]--;
        }
    }
    private static void circleSquare(int[] leftup, int[] rightdown, int[][] arr) {
        int p1[] = { leftup[0], leftup[1] };//0  0
        int p2[] = { leftup[0], rightdown[1] };// 0 3
        int p3[] = { rightdown[0], rightdown[1] };// 3 3
        int p4[] = { rightdown[0], leftup[1] };//3  0
        //定义四个具体点，然后进行指定哪个点到哪个地方
        //从左向右遍历
        while (p1[1] < rightdown[0]) {
            int temp = arr[p4[0]][p4[1]];
            arr[p4[0]][p4[1]] = arr[p3[0]][p3[1]];
            arr[p3[0]][p3[1]] = arr[p2[0]][p2[1]];
            arr[p2[0]][p2[1]] = arr[p1[0]][p1[1]];
            arr[p1[0]][p1[1]] = temp;
            //往右边挪位置，继续转圈指定
            p1[1]++;
            p2[0]++;
            p3[1]--;
            p4[0]--;

        }
    }
    //打印原矩阵
    public static void print(int[][] arr) {
        for (int i = 0; i < 4; i++) {
            for (int j = 0; j < 4; j++) {
                System.out.print(arr[i][j] + "     ");
            }
            System.out.println();
        }
    }
    public static void main(String[] args) {
        int arr[][] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 }, { 13, 14, 15, 16 } };
        print(arr);
        circleMatrix(arr);
        System.out.println("--------------------------");
        print(arr);
    }
}
